package com.SpringMVC.controller;

import java.io.File;
import java.io.IOException;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.SpringMVC.model.Course;
import com.SpringMVC.service.CourseService;

@Controller
// 指明此controller应该处理什么url
@RequestMapping("/courses")
// 在根目录下的路径 /courses/**中的所有请求都会被此controller所拦截
public class CourseController {

	private static Logger log = LoggerFactory.getLogger(CourseController.class);

	private CourseService courseService;

	public CourseService getCourseService() {
		return courseService;
	}

	@Autowired
	public void setCourseService(CourseService courseService) {
		this.courseService = courseService;
	}

	// 提供一个方法根据课程id去查询课程信息
	// 本方法将会处理来自/courses/view下的路径
	// @RequestParam直接获取传递过来的参数并且提交和courseId作为参数被
	// 方法调用/view?coursId=123
	@RequestMapping(value = "/view", method = RequestMethod.GET)
	public String viewCourse(@RequestParam("courseId") int courseId, Model model) {
		// 用于观察courseid是否就是前台传递过来的变量
		log.debug("in viewCourse,courseid={}", courseId);
		// log.info("in viewCourse,courseid={}",courseId);
		Course course = courseService.getCoursebyId(courseId);
		model.addAttribute(course);
		// 将数据放置到model中这样就可以将model中的course
		// 用el表达式在jsp页面上获取

		return "course_overview";
		/*
		 * InternalResourceViewResolver在dispatcherservlet的xml文件中
		 * 使用了这个视图解析器会将controller返回的值解析成一个jsp页面
		 */
	}

	// 使用另外一种方式去处理不同形式的id
	// courses/view2/{courseId}
	// 这种新的占位符URL就要使用@pathvariable的注解将{}中的参数传递给函数的参数
	@RequestMapping(value = "/view2/{courseId}", method = RequestMethod.GET)
	public String viewCourse2(@PathVariable("courseId") Integer courseId, Map<String, Object> model) {
		// 使用model 的map就可以将不同/view2/{}中的值都获取然后放到map中进行保存
		System.out.println(courseId);
		log.debug("in viewCourse2,courseid={}", courseId);
		Course course = courseService.getCoursebyId(courseId);
		model.put("course", course);
		return "course_overview";

	}

	// 使用传统的request方式来处理相应的请求
	@RequestMapping(value = "/view3")
	public String viewCourse3(HttpServletRequest request) {
		int courseId = Integer.parseInt(request.getParameter("courseId"));
		log.debug("in viewCourse3,courseId ={}", courseId);
		Course course = courseService.getCoursebyId(courseId);
		request.setAttribute("course", course);
		return "course_overview";
	}

	@RequestMapping(value = "/admin", method = RequestMethod.GET, params = "add")
	// 使用了add参数那么只有当url访问中有add参数的时候才会调用这个方法
	public String createCourse() {

		// 访问根目录下的jsp页面，直接这样写就可以了
		return "course_admin/edit";
	}
	/*
	 * 因为在edit.jsp中的form表单里Action路径为course/save
	 * 所以要对于这个表单的处理那么就要使用requsetMapping去对应处理
	 */

	// 在此处的方法，直接将表单中的所有属性都封装到了course对象中
	// 前提是(course bean 对象已经建立)，这样就可以自动的将这些值都传递到
	// course对象中去，但是也可以使用别的比较麻烦的方式，就是一个个的
	// 将属性获取出来
	@RequestMapping(value = "/save", method = RequestMethod.POST)
	public String doSave(@ModelAttribute Course course) {
//		log.debug("info of course:");
//		log.debug(ReflectionToStringBuilder.toString(course));
		System.out.println(course.toString());
		//在此进行业务操作，比如数据库持久化的操作
		course.setCourseId(123);
		return "redirect:view2/"+course.getCourseId();
	}
	//@RequestMapping(value = "/save", method = RequestMethod.POST)
	public String doSavetest(@RequestParam("title")String title,@RequestParam("duration")long duration,@RequestParam("level")int level,@RequestParam("descr")String descr) {
		System.out.println("在dosavetest中：title:"+title+" duration:"+duration+" level:"+level+"descr: "+descr);
		return null;
	}
	@RequestMapping(value="/upload",method=RequestMethod.GET)
	public String showUploadPage() {
		return "course_admin/file";
	}
	@RequestMapping(value="/doUpload",method=RequestMethod.POST)
	public String doUpload(@RequestParam("file")MultipartFile file) throws IOException {
		System.out.println(file.getOriginalFilename());
		if(!file.isEmpty()) {
			log.debug("process file:{}",file.getOriginalFilename());
			FileUtils.copyInputStreamToFile(file.getInputStream(), new File("/Users/duyifan/Desktop/手动结构化/",System.currentTimeMillis()+file.getOriginalFilename()));
			return "success";
		}		
		return "sudccess";
	}
	
	/*@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后，
	 * 写入到response对象的body区，通常用来返回JSON数据或者是XML
	 * 加上@responsebody后，返回结果直接写入HTTP response body中，不会被解析为跳转路径。
	 * */
	
	//使用@ResponseBody就可以返回json格式的返回值
	@RequestMapping(value="/{courseId}",method=RequestMethod.GET)
	public @ResponseBody Course getCourseInJson(@PathVariable Integer courseId) {
		return courseService.getCoursebyId(courseId);
	}
	@RequestMapping(value="/jsontype/{courseId}",method=RequestMethod.GET)
	public ResponseEntity<Course> getCourseInJson2(@PathVariable Integer courseId){
		Course course = courseService.getCoursebyId(courseId);
		return new ResponseEntity<Course>(course,HttpStatus.OK);
	}
}

